Aims to understand how neural networks perceive images
Evolved in response to a desire to make neural nets more interpretable
For latest developments: brilliant series of articles on Distill
First introduced in 2013
Compute the gradient of output category (target class) w.r.t. input image
Positive gradients: a small change to the pixel will increase the probability of target class
Visualising the gradients provide some intuition of attention
from flashtorch.utils import load_image
image = load_image('../../examples/images/great_grey_owl_01.jpg')
plt.imshow(image)
plt.title('Original image')
plt.axis('off');
from flashtorch.utils import apply_transforms, denormalize, format_for_plotting
input_ = apply_transforms(image)
print(f'Before: {type(image)}')
print(f'After: {type(input_)}, {input_.shape}')
plt.imshow(format_for_plotting(denormalize(input_)))
plt.title('Input tensor')
plt.axis('off');
Before: <class 'PIL.Image.Image'> After: <class 'torch.Tensor'>, torch.Size([1, 3, 224, 224])
from flashtorch.saliency import Backprop
model = models.alexnet(pretrained=True)
backprop = Backprop(model)
Signature:
backprop.calculate_gradients(input_, target_class=None, take_max=False)
from flashtorch.utils import ImageNetIndex
imagenet = ImageNetIndex()
target_class = imagenet['great grey owl']
print(f'Traget class index: {target_class}')
gradients = backprop.calculate_gradients(input_, target_class)
max_gradients = backprop.calculate_gradients(input_, target_class, take_max=True)
print(type(gradients), gradients.shape)
print(type(max_gradients), max_gradients.shape)
Traget class index: 24 <class 'torch.Tensor'> torch.Size([3, 224, 224]) <class 'torch.Tensor'> torch.Size([1, 224, 224])
from flashtorch.utils import visualize
visualize(input_, gradients, max_gradients)
guided_gradients = backprop.calculate_gradients(input_, target_class, guided=True)
max_guided_gradients = backprop.calculate_gradients(input_, target_class, take_max=True, guided=True)
visualize(input_, guided_gradients, max_guided_gradients)
visualize(input_, guided_gradients, max_guided_gradients)
visualize(input_, guided_gradients, max_guided_gradients)
A model developed for a task is reused as a starting point for another task
Pre-trained models often used in computer visions & natural language processing tasks
Save compute & time resources
image = load_image('../../examples/images/foxglove.jpg')
plt.imshow(image)
plt.title('Foxglove')
plt.axis('off');
backprop = Backprop(pretrained_model)
guided_gradients = backprop.calculate_gradients(input_, class_index, guided=True)
guided_max_gradients = backprop.calculate_gradients(input_, class_index, take_max=True, guided=True)
visualize(input_, guided_gradients, guided_max_gradients)
/Users/misao/Projects/personal/flashtorch/flashtorch/saliency/backprop.py:93: UserWarning: The predicted class does not equal the
target class. Calculating the gradient with respect to the
predicted class.
predicted class.'''))
backprop = Backprop(trained_model)
guided_gradients = backprop.calculate_gradients(input_, class_index, guided=True)
guided_max_gradients = backprop.calculate_gradients(input_, class_index, take_max=True, guided=True)
visualize(input_, guided_gradients, guided_max_gradients)